package pe.com.bbva.ge.vista.vaadin.ui.utileria;

import java.math.BigDecimal;
import java.math.BigInteger;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;
import org.apache.poi.ss.formula.ptg.DividePtg;

import pe.com.bbva.ge.domain.configuracion.Denominacion;
import pe.com.bbva.ge.utileria.UtileriaComun;
import pe.com.bbva.ge.vista.vaadin.ui.utileria.ManejadorDivisa.Invocador;

import com.vaadin.event.FieldEvents.BlurEvent;
import com.vaadin.event.FieldEvents.BlurListener;
import com.vaadin.event.FieldEvents.FocusEvent;
import com.vaadin.event.FieldEvents.FocusListener;
import com.vaadin.event.FieldEvents.TextChangeEvent;
import com.vaadin.event.FieldEvents.TextChangeListener;
import com.vaadin.ui.TextField;

public class ManejadorDenominacion2 implements FocusListener, BlurListener {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = -2993425852908769225L;

	private Denominacion denominacion;
	
	private ManejadorDivisa manejadorDivisa;

	private TextField txtTotalDenominacion;
	
	private TextField txtCantidad;
	private TextField txtImporte;
	private TextField txtDeteriorado;
	
	private boolean lstnrCantidad;
	private boolean lstnrImporte;
	private boolean lstnrDeteriorado;
	
	private String valorAntiguo;
	
	private static final String DECIMAL_DEFECTO = "0.0";
	private static final String INTEGER_DEFECTO = "0";
	
	public ManejadorDenominacion2(Denominacion denominacion,
			ManejadorDivisa manejadorDivisa, TextField txtTotalDenominacion,
			TextField txtCantidad, TextField txtImporte,
			TextField txtDeteriorado) {
		this.denominacion = denominacion;
		this.manejadorDivisa = manejadorDivisa;
		this.txtTotalDenominacion = txtTotalDenominacion;
		this.txtCantidad = txtCantidad;
		this.txtImporte = txtImporte;
		this.txtDeteriorado = txtDeteriorado;
		
		inicializarTextFields();
		
	}
	
	public ManejadorDenominacion2(Denominacion denominacion,
			ManejadorDivisa manejadorDivisa) {
		this.denominacion = denominacion;
		this.manejadorDivisa = manejadorDivisa;
	}

	private void inicializarTextFields()
	{
		if(manejadorDivisa.isModoCrear())
		{
			inicializarValores();
		}
		agregarPropiedades();
		asignarListeners();
	}

	private void inicializarValores() {
		if(this.txtTotalDenominacion != null)
		{
			this.txtTotalDenominacion.setValue(DECIMAL_DEFECTO);
		}		
		if(this.txtCantidad != null)
		{
			this.txtCantidad.setValue(INTEGER_DEFECTO);
		}
		
		if(this.txtImporte != null)
		{
			this.txtImporte.setValue(DECIMAL_DEFECTO);
		}
		
		if(this.txtDeteriorado != null)
		{
			this.txtDeteriorado.setValue(INTEGER_DEFECTO);
		}
	}

	private void agregarPropiedades() {
		if(this.txtTotalDenominacion != null)
		{
			this.txtTotalDenominacion.setImmediate(false);
			this.txtTotalDenominacion.setEnabled(false);
		}		
		if(this.txtCantidad != null)
		{
			this.txtCantidad.setImmediate(true);
			this.txtCantidad.setEnabled(true);
		}
		
		if(this.txtImporte != null)
		{
			this.txtImporte.setImmediate(true);
			this.txtImporte.setEnabled(true);
		}
		
		if(this.txtDeteriorado != null)
		{
			this.txtDeteriorado.setImmediate(true);
			this.txtDeteriorado.setEnabled(true);
		}
	}
	
	private void asignarListeners() {
		
		if(this.txtCantidad != null && !this.lstnrCantidad)
		{
			this.txtCantidad.addListener((FocusListener)this);
			this.txtCantidad.addListener((BlurListener)this);
			this.lstnrCantidad = true;
		}
		
		if(this.txtImporte != null && !this.lstnrImporte)
		{
			this.txtImporte.addListener((FocusListener)this);
			this.txtImporte.addListener((BlurListener)this);
			this.lstnrImporte = true;
		}
		
		if(this.txtDeteriorado != null && !this.lstnrDeteriorado)
		{
			this.txtDeteriorado.addListener((FocusListener)this);
			this.txtDeteriorado.addListener((BlurListener)this);
			this.lstnrDeteriorado = true;
		}
	}
	
	@Override
	public void focus(FocusEvent event) {
		/*this.valorAntiguo = (String)((TextField)event.getComponent()).getValue();
		System.out.println("[focus:valorAntiguo]" + valorAntiguo);*/
	}

	//public void textChange(TextChangeEvent event) { //1
	@Override
	public void blur(BlurEvent event) { //2
		
		/*String valorActual = (String)((TextField)event.getSource()).getValue();
		System.out.println("[blur:valorActual]" + valorActual);
		
		System.out.println(StringUtils.equals(valorActual, valorAntiguo) || 
				(StringUtils.equals(DECIMAL_DEFECTO, valorAntiguo) && StringUtils.equals(valorActual, DECIMAL_DEFECTO) ));
		
		if(StringUtils.equals(valorActual, valorAntiguo) || 
				(StringUtils.equals(DECIMAL_DEFECTO, valorAntiguo) && StringUtils.equals(valorActual, DECIMAL_DEFECTO) ))
		{
			return;
		}	*/	
		
		BigDecimal total = new BigDecimal(DECIMAL_DEFECTO);
		if(event.getSource().equals(this.txtCantidad))
		{
			this.txtImporte.setValue(DECIMAL_DEFECTO);
			if(this.txtDeteriorado != null)
			{
				this.txtDeteriorado.setValue(INTEGER_DEFECTO);
			}
			//BigDecimal cantidad = UtileriaComun.obtenerBigDecimal(event.getText()); //1
			BigDecimal cantidad = UtileriaComun.obtenerBigDecimal((String)this.txtCantidad.getValue()); //2
			total = denominacion.getValor().multiply(cantidad);
			
		}
		else if(event.getSource().equals(this.txtImporte))
		{
			this.txtCantidad.setValue(INTEGER_DEFECTO);
			if(this.txtDeteriorado != null)
			{
				this.txtDeteriorado.setValue(INTEGER_DEFECTO);
			}
			//total = UtileriaComun.obtenerBigDecimal(event.getText()); //1
			total = UtileriaComun.obtenerBigDecimal((String)this.txtImporte.getValue()); //2
		}
		else if(event.getSource().equals(this.txtDeteriorado))
		{
			this.txtImporte.setValue(DECIMAL_DEFECTO);
			BigDecimal solicitado = new BigDecimal(StringUtils.trimToEmpty((String)this.txtTotalDenominacion.getValue()));
			//BigDecimal subtotal = denominacion.getValor().multiply(UtileriaComun.obtenerBigDecimal(event.getText()));//1
			BigDecimal subtotal = denominacion.getValor().multiply(UtileriaComun.obtenerBigDecimal((String)this.txtDeteriorado.getValue()));//2
			total = solicitado.add(subtotal);
		}
		
		this.txtTotalDenominacion.setValue(total.toString());
		
		this.manejadorDivisa.setInvocador(Invocador.DENOMINACION);
		this.manejadorDivisa.calcularTotalDivisa();
	}
	
	public BigInteger getCantidadYDeteriorado() {		
		return getCantidad().add(getDeteriorado());
	}
	
	public BigInteger getCantidad()
	{
		BigInteger cantidadSolicitada = new BigInteger(INTEGER_DEFECTO);		
		
		if(StringUtils.isNotEmpty((String)txtImporte.getValue()) 
				&& NumberUtils.isNumber((String)txtImporte.getValue()) 
				&& !StringUtils.equals(DECIMAL_DEFECTO, (String)txtImporte.getValue()) )
		{
			BigDecimal total = new BigDecimal(StringUtils.trimToEmpty((String)txtImporte.getValue()));
			cantidadSolicitada = total.divide(denominacion.getValor()).toBigInteger();
		}
		else if(StringUtils.isNotEmpty((String)txtCantidad.getValue()) 
				&& NumberUtils.isNumber((String)txtCantidad.getValue())
				&& !StringUtils.equals(INTEGER_DEFECTO, (String)txtCantidad.getValue()) )
		{
			cantidadSolicitada = new BigInteger(StringUtils.trimToEmpty((String)txtCantidad.getValue()));
		}
		
		return cantidadSolicitada;
	}
	
	public BigInteger getDeteriorado()
	{
		BigInteger deteriorado = new BigInteger(INTEGER_DEFECTO);
		if(this.txtDeteriorado != null && StringUtils.isNotEmpty((String)txtDeteriorado.getValue()) 
				&& NumberUtils.isNumber((String)txtDeteriorado.getValue())
				&& !StringUtils.equals(INTEGER_DEFECTO, (String)txtDeteriorado.getValue()))
		{
			deteriorado = new BigInteger(StringUtils.trimToEmpty((String)txtDeteriorado.getValue()));
			
		}
		return deteriorado;
	}
	
	public boolean tieneMonto()
	{
		String solicitado = (String)this.txtTotalDenominacion.getValue();
		if(StringUtils.isNotEmpty(solicitado) && NumberUtils.isNumber(solicitado))
		{
			BigDecimal bdSolicitado = new BigDecimal(solicitado);
			return bdSolicitado.floatValue() > 0;
			
		}
		return false;
	}

	public void setDenominacion(Denominacion denominacion) {
		this.denominacion = denominacion;
	}
	
	public void setManejadorDivisa(ManejadorDivisa manejadorDivisa) {
		this.manejadorDivisa = manejadorDivisa;
	}
	
	public void setTxtTotalDenominacion(TextField txtTotalDenominacion) {
		this.txtTotalDenominacion = txtTotalDenominacion;
		inicializarTextFields();
	}
	
	public void setTxtCantidad(TextField txtCantidad) {
		this.txtCantidad = txtCantidad;
		inicializarTextFields();
	}
	
	public void setTxtImporte(TextField txtImporte) {
		this.txtImporte = txtImporte;
		inicializarTextFields();
	}
	
	public void setTxtDeteriorado(TextField txtDeteriorado) {
		this.txtDeteriorado = txtDeteriorado;
		inicializarTextFields();
	}
	
}
